/*
 * FrontCoding.cpp
 *
 *  Created on: 07/11/2010
 *      Author: julfc
 */

#include "FrontCoding.h"

FrontCoding::FrontCoding() {
}

vector<PalabraFrontCoding> FrontCoding::encode(vector<string> palabras) {
	vector<PalabraFrontCoding> resp;
	string palabra = palabras[0];
	unsigned int i = 1;

	//Meto de una la primer palabra.
	PalabraFrontCoding fco (0, palabra.size(), palabra);
	resp.push_back(fco);
	if (palabras.size() > 1) {
		while (i < palabras.size()) {
			PalabraFrontCoding fc = encodearPalabra(palabra, palabras[i]);
			palabra = palabras[i];
			resp.push_back(fc);
			i++;
		}
	}
	return resp;
}

vector<string> FrontCoding::decode(vector<PalabraFrontCoding> palabras) {
	vector<string> resp;

	string palabra = palabras[0].cadena;
	unsigned int i = 1;

	//Meto de una la primer palabra.
	resp.push_back(palabra);

	if (palabras.size() > 1) {
		while (i < palabras.size()) {
			string decoded = decodearPalabra(palabras[i], palabra);
			palabra = decoded;
			resp.push_back(decoded);
			i++;
		}
	}
	return resp;
}

PalabraFrontCoding FrontCoding::encodearPalabra (string str1, string str2) {
	int caractComun = cantidaCaractEnComun(str1, str2);
	int cantCaracAlm = str2.size() - caractComun;
	string cadena = str2.substr(caractComun, str2.size());
	PalabraFrontCoding resp(caractComun, cantCaracAlm, cadena);
	return resp;
}

string FrontCoding::decodearPalabra (PalabraFrontCoding toDecode, string str1) {
	string cadena = str1.substr(0, toDecode.cantCarctComun);
	cadena.append(toDecode.cadena);
	return cadena;

}

int FrontCoding::cantidaCaractEnComun(string str1, string str2) {
	string::const_iterator it1 = str1.begin();
	string::const_iterator it2 = str2.begin();
	unsigned int i = 0;
	bool distinto = false;

	it1 = str1.begin();
	it2 = str2.begin();

	while(it1 != str1.end() && it2 != str2.end() && !distinto) {
		char caract1 = *it1;
		char caract2 = *it2;
		if (caract1 != caract2) {
			//Es distinta la letra
			distinto = true;
		} else {
			//Es igual el caracter
			i++;
			it1++;
			it2++;
		}
	}
	return i;
}

FrontCoding::~FrontCoding() {
	// TODO Auto-generated destructor stub
}
